import os.path
from logging.handlers import WatchedFileHandler
from datetime import datetime


# 支持每天创建一个日志文件
class DayRotatingFileHandler(WatchedFileHandler):
    FMT = "%Y%m%d"
    def __init__(
        self,
        file_path:str,
        file_prefix="django",
        model="a",
        delay = None,
        encoding = None,
    ):
        """
        :param file_path: 日志文件保存的目录路径
        :param file_prefix: 日志文件使用的前缀，如 django_20251230.log
        :param model: 文件打开模式
        :param encoding: 编码模式
        :param delay:
        :param errors:
        """
        if not os.path.exists(file_path):
            os.makedirs(file_path)
        # 日志文件存放的路径
        self.file_path = file_path
        # 日志文件名的前缀如 django, 文件名=django-日期.log
        self.file_prefix = file_prefix
        # 获取当前日期的日志文件名
        self.file_name = self.get_current_file_name()
        # 构建日志文件的绝对路径
        file_name = os.path.join(file_path, self.get_current_file_name())
        # 调用父类的初始化方法
        super().__init__(filename=file_name,mode=model,delay=delay,encoding=encoding)

    def get_current_file_name(self)->str:
        # 构建当前日期的日志文件名
        current_file_name = f"{self.file_prefix}_{datetime.now().strftime(self.FMT)}.log"
        return current_file_name

    def emit(self, record):
        # 根据当前日期创建文件
        current_file_name = self.get_current_file_name()
        # 文件名不相等：新建文件+重新打开+重新读取os.state
        if current_file_name != self.file_name:
            self.file_name = current_file_name
            # 重新赋值,当前的文件名应该是最新的日志
            self.baseFilename = os.path.abspath(
                os.path.join(self.file_path, current_file_name)
            )

            if self.stream:
                self.stream.flush()
                self.stream.close()

            self.stream = self._open()
            self._statstream()

        # 文件相等，当文件被删除 或 文件修改 则重新打开文件
        self.reopenIfNeeded()

        super().emit(record)

